import request from '@/utils/request'
import axios from 'axios'
import { ElMessage } from 'element-plus'
import { dispatchAuthEvent, AUTH_EVENTS } from '@/utils/auth'

/**
 * 用户密码登录
 * @param {Object} data - 包含用户名和密码的对象
 * @returns {Promise}
 */
export function login(data) {
  // 创建取消令牌
  const source = axios.CancelToken.source();
  
  const requestConfig = {
    url: '/saas/auth/login',
    method: 'post',
    data,
    timeout: 15000,
    cancelToken: source.token,
    // 跳过重定向，因为如果登录失败不应该重定向到登录页
    _skipRedirect: true,
    _skipAuthRedirect: true, // 跳过权限检查
    meta: { 
      isPublic: true // 标记为公开API
    },
    headers: {
      'Content-Type': 'application/json',
      'X-Login-Source': 'saas', // 添加登录来源标识
      'X-Login-Client': 'web', // 添加客户端标识
      'X-Login-Version': '1.0' // 添加版本标识
    }
  };
  
  // 自动取消超时请求
  const timeoutId = setTimeout(() => {
    source.cancel('登录请求超时');
  }, 15000);
  
  const loginPromise = request(requestConfig);
  
  // 登录成功或失败都需要清理计时器
  loginPromise
    .then(response => {
      clearTimeout(timeoutId);
      // 确保响应中包含token
      if (response && response.data && response.data.token) {
        // 保存token到本地存储
        localStorage.setItem('token', response.data.token);
        // 如果有用户名，也保存
        if (response.data.username) {
          localStorage.setItem('username', response.data.username);
        }
        
        // 记录登录时间
        localStorage.setItem('login_time', Date.now().toString());
        
        // 发送登录成功事件
        dispatchAuthEvent(AUTH_EVENTS.LOGIN, {
          username: response.data.username,
          token: response.data.token
        });
      } else {
        // console.warn('登录响应中没有包含有效的token');
      }
    })
    .catch(error => {
      clearTimeout(timeoutId);
      // console.error('登录请求失败:', error.message || '未知错误');
    });
  
  return loginPromise;
}

/**
 * 短信验证码登录
 * @param {Object} data - 包含手机号和验证码的对象
 * @returns {Promise}
 */
export function smsLogin(data) {
  return request({
    url: '/saas/auth/sms/login',
    method: 'post',
    data,
    _skipRedirect: true, // 避免在处理过程中被重定向
    _skipAuthRedirect: true, // 跳过权限检查，因为这是登录请求
    meta: { 
      isPublic: true // 标记为公开API
    },
    headers: {
      'X-Login-Source': 'saas',
      'X-Login-Client': 'web',
      'X-Login-Version': '1.0'
    }
  }).then(response => {
    if (response && response.data && response.data.token) {
      // 保存token到本地存储
      localStorage.setItem('token', response.data.token);
      
      // 如果有用户名，也保存
      if (response.data.username) {
        localStorage.setItem('username', response.data.username);
      }
      
      // 记录登录时间
      localStorage.setItem('login_time', Date.now().toString());
      
      // 发送登录成功事件
      dispatchAuthEvent(AUTH_EVENTS.LOGIN, {
        username: response.data.username,
        token: response.data.token
      });
    }
    return response;
  });
}

/**
 * 发送短信验证码
 * @param {Object} data - 包含手机号的对象
 * @returns {Promise}
 */
export function sendSmsCode(data) {
  const mobile = data && data.mobile ? data.mobile : '';
  return request({
    url: `/saas/auth/sms-code?mobile=${encodeURIComponent(mobile)}`,
    method: 'post',
    // 确保不会有缓存问题
    headers: {
      'Cache-Control': 'no-cache',
      'Pragma': 'no-cache'
    },
    _skipAuthRedirect: true, // 跳过权限检查
    meta: { 
      isPublic: true // 标记为公开API
    }
  }).catch(error => {
    // console.error('发送验证码失败详情:', error);
    // // 获取更详细的错误信息
    // if (error.response) {
    //   console.error('错误状态码:', error.response.status);
    //   console.error('错误响应头:', error.response.headers);
    //   console.error('错误响应数据:', error.response.data);
    // }
    throw error;
  });
}

/**
 * 用户注册
 * @param {Object} data - 包含注册信息的对象
 * @returns {Promise}
 */
export function register(data) {
  
  return request({
    url: '/saas/auth/register',
    method: 'post',
    data
  })
}

/**
 * 设置密码
 * @param {Object} data - 密码数据
 * @param {string} data.password - 要设置的密码
 * @returns {Promise} - 包含结果的Promise
 */
export function setPassword(data) {
  
  // 构建请求参数
  const params = new URLSearchParams();
  params.append('password', data.password);
  
  // 使用统一的请求配置，Authorization头由拦截器处理
  const config = {
    url: '/saas/auth/set-password',
    method: 'post',
    data: params,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  };
  
  return request(config);
}

/**
 * 获取用户信息
 * @returns {Promise}
 */
export function getUserInfo() {
  return request({
    url: '/saas/user/info', // 修改为正确的API路径
    method: 'get',
    timeout: 10000,
    // 添加重试机制
    retry: 2,
    retryDelay: 1000,
    // 记录详细的请求信息
    _logDetails: true
  }).then(response => {
    return response;
  }).catch(error => {
    console.error('获取用户信息失败:', error);
    // 获取更详细的错误信息
    if (error.response) {
      console.error('错误状态码:', error.response.status);
      console.error('错误响应数据:', error.response.data);
    }
    // 重新抛出错误，让调用者处理
    throw error;
  });
}

/**
 * 用户登出
 * @returns {Promise}
 */
export function logout() {
  return request({
    url: '/saas/auth/logout',
    method: 'post'
  }).finally(() => {
    // 清除所有登录相关信息（包括 isFirstLogin 标记）
    localStorage.removeItem('token');
    localStorage.removeItem('username');
    localStorage.removeItem('userId');
    localStorage.removeItem('userInfo');
    localStorage.removeItem('isFirstLogin');
    // 清除 sessionStorage 中的 Dashboard token 记录，以便下次登录时能检测到 token 变化
    sessionStorage.removeItem('lastDashboardToken');
    // 发送登出事件
    dispatchAuthEvent(AUTH_EVENTS.LOGOUT);
  });
}

/**
 * 更新密码
 * @param {Object} data - 包含新旧密码的对象
 * @returns {Promise}
 */
export function updatePassword(data) {
  const params = new URLSearchParams();
  params.append('newPassword', data.newPassword);
  params.append('currentPassword', data.currentPassword);
  
  return request({
    url: '/saas/auth/update-password',
    method: 'post',
    data: params,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  });
}

/**
 * 简化版更新密码（不需要验证当前密码）
 * @param {Object} data - 包含新密码的对象
 * @returns {Promise}
 */
export function updatePasswordSimple(data) {
  const params = new URLSearchParams();
  params.append('newPassword', data.newPassword);
  // 添加一个空的currentPassword参数，以符合后端接口要求
  params.append('currentPassword', '');
  
  return request({
    url: '/saas/auth/update-password',
    method: 'post',
    data: params,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  });
}

/**
 * 重置密码
 * @param {Object} data - 包含新密码和用户信息的对象
 * @returns {Promise}
 */
export function resetPassword(data) {
  const params = new URLSearchParams();
  params.append('password', data.password);
  
  if (data.username) {
    params.append('username', data.username);
  }
  
  if (data.phone) {
    params.append('phone', data.phone);
  }
  
  return request({
    url: '/saas/auth/reset-password',
    method: 'post',
    data: params,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  });
}

/**
 * 刷新认证令牌
 * @returns {Promise}
 */
export function refreshToken() {
  
  // 创建请求配置，确保跳过自动重定向
  const requestConfig = {
    url: '/saas/auth/refresh-token',
    method: 'post',
    // 标记为不需要自动重定向
    _skipRedirect: true
  };
  
  const refreshPromise = request(requestConfig);
  
  // 处理令牌刷新结果
  refreshPromise
    .then(response => {
      if (response && response.data && response.data.token) {
        // 更新本地存储的令牌
        localStorage.setItem('token', response.data.token);
      } else {
        console.warn('令牌刷新响应不包含有效令牌');
      }
    })
    .catch(error => {
      console.error('令牌刷新失败:', error.message || '未知错误');
      
      // 如果刷新失败，清除本地令牌，用户需要重新登录
      if (error.response && (error.response.status === 401 || error.response.status === 403)) {
        console.warn('认证已失效，清除本地令牌');
        localStorage.removeItem('token');
      }
    });
  
  return refreshPromise;
} 